{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "lines = \"\"\"1 42.05\n",
    "2 22.81\n",
    "3 15.95\n",
    "4 13.28\n",
    "5 12.27\n",
    "6 10.38\n",
    "7 11.00\n",
    "8 11.41\n",
    "9 12.17\n",
    "10 12.69\n",
    "11 11.34\n",
    "12 11.35\n",
    "13 10.88\n",
    "14 11.63\n",
    "15 11.79\n",
    "16 11.49\n",
    "17 11.29\n",
    "18 10.78\n",
    "19 10.92\n",
    "20 11.07\n",
    "1 40.47\n",
    "2 22.93\n",
    "3 15.88\n",
    "4 13.25\n",
    "5 12.22\n",
    "6 10.95\n",
    "7 10.81\n",
    "8 11.26\n",
    "9 11.96\n",
    "10 12.43\n",
    "11 11.19\n",
    "12 10.91\n",
    "13 11.03\n",
    "14 10.56\n",
    "15 10.62\n",
    "16 11.73\n",
    "17 11.00\n",
    "18 12.81\n",
    "19 12.38\n",
    "20 11.28\n",
    "1 40.81\n",
    "2 22.79\n",
    "3 15.83\n",
    "4 13.27\n",
    "5 12.33\n",
    "6 10.65\n",
    "7 10.94\n",
    "8 11.48\n",
    "9 11.78\n",
    "10 12.78\n",
    "11 11.31\n",
    "12 10.97\n",
    "13 10.80\n",
    "14 10.93\n",
    "15 10.69\n",
    "16 10.57\n",
    "17 10.54\n",
    "18 10.55\n",
    "19 10.79\n",
    "20 10.64\n",
    "1 40.85\n",
    "2 22.67\n",
    "3 16.05\n",
    "4 13.21\n",
    "5 12.53\n",
    "6 10.84\n",
    "7 10.80\n",
    "8 11.31\n",
    "9 11.69\n",
    "10 12.51\n",
    "11 11.22\n",
    "12 11.35\n",
    "13 11.00\n",
    "14 10.64\n",
    "15 10.89\n",
    "16 10.49\n",
    "17 10.55\n",
    "18 10.76\n",
    "19 10.54\n",
    "20 10.75\n",
    "1 40.41\n",
    "2 22.75\n",
    "3 15.87\n",
    "4 13.19\n",
    "5 12.33\n",
    "6 10.50\n",
    "7 10.84\n",
    "8 11.55\n",
    "9 11.79\n",
    "10 12.53\n",
    "11 11.24\n",
    "12 11.13\n",
    "13 10.89\n",
    "14 10.52\n",
    "15 10.74\n",
    "16 10.68\n",
    "17 10.88\n",
    "18 10.61\n",
    "19 11.07\n",
    "20 10.71\n",
    "1 40.45\n",
    "2 22.73\n",
    "3 16.35\n",
    "4 13.09\n",
    "5 12.19\n",
    "6 10.39\n",
    "7 11.01\n",
    "8 11.30\n",
    "9 11.81\n",
    "10 12.24\n",
    "11 11.21\n",
    "12 11.13\n",
    "13 10.66\n",
    "14 10.56\n",
    "15 10.91\n",
    "16 10.49\n",
    "17 10.58\n",
    "18 10.61\n",
    "19 10.60\n",
    "20 10.69\n",
    "1 40.36\n",
    "2 22.64\n",
    "3 15.95\n",
    "4 13.20\n",
    "5 12.27\n",
    "6 10.34\n",
    "7 10.47\n",
    "8 11.34\n",
    "9 11.68\n",
    "10 12.30\n",
    "11 11.04\n",
    "12 10.85\n",
    "13 10.78\n",
    "14 10.64\n",
    "15 10.63\n",
    "16 10.58\n",
    "17 10.67\n",
    "18 10.64\n",
    "19 10.71\n",
    "20 10.68\n",
    "1 40.70\n",
    "2 22.71\n",
    "3 15.81\n",
    "4 13.10\n",
    "5 12.29\n",
    "6 10.34\n",
    "7 10.40\n",
    "8 11.40\n",
    "9 11.71\n",
    "10 12.56\n",
    "11 11.29\n",
    "12 10.99\n",
    "13 10.51\n",
    "14 10.69\n",
    "15 10.53\n",
    "16 11.04\n",
    "17 10.67\n",
    "18 10.71\n",
    "19 10.86\n",
    "20 10.78\n",
    "1 40.69\n",
    "2 22.80\n",
    "3 15.88\n",
    "4 13.13\n",
    "5 12.19\n",
    "6 10.36\n",
    "7 10.77\n",
    "8 11.32\n",
    "9 11.66\n",
    "10 12.29\n",
    "11 11.06\n",
    "12 10.89\n",
    "13 10.66\n",
    "14 10.61\n",
    "15 10.36\n",
    "16 10.57\n",
    "17 10.94\n",
    "18 10.57\n",
    "19 10.81\n",
    "20 10.72\n",
    "1 40.81\n",
    "2 22.76\n",
    "3 15.84\n",
    "4 13.10\n",
    "5 12.25\n",
    "6 10.33\n",
    "7 10.58\n",
    "8 11.51\n",
    "9 11.69\n",
    "10 12.45\n",
    "11 11.51\n",
    "12 11.53\n",
    "13 10.61\n",
    "14 10.52\n",
    "15 10.57\n",
    "16 10.57\n",
    "17 10.76\n",
    "18 10.60\n",
    "19 10.66\n",
    "20 10.73\n",
    "1 40.84\n",
    "2 22.83\n",
    "3 15.86\n",
    "4 13.27\n",
    "5 12.39\n",
    "6 10.45\n",
    "7 10.87\n",
    "8 11.42\n",
    "9 11.70\n",
    "10 12.55\n",
    "11 11.43\n",
    "12 10.98\n",
    "13 10.81\n",
    "14 10.69\n",
    "15 10.68\n",
    "16 10.71\n",
    "17 10.80\n",
    "18 10.76\n",
    "19 10.90\n",
    "20 11.02\n",
    "1 40.99\n",
    "2 22.99\n",
    "3 16.10\n",
    "4 13.46\n",
    "5 12.45\n",
    "6 10.47\n",
    "7 10.79\n",
    "8 11.74\n",
    "9 11.64\n",
    "10 12.37\n",
    "11 11.20\n",
    "12 11.09\n",
    "13 10.82\n",
    "14 10.61\n",
    "15 10.56\n",
    "16 10.53\n",
    "17 10.60\n",
    "18 10.81\n",
    "19 10.72\n",
    "20 10.62\n",
    "1 40.94\n",
    "2 23.09\n",
    "3 16.03\n",
    "4 13.40\n",
    "5 12.51\n",
    "6 10.38\n",
    "7 10.58\n",
    "8 11.37\n",
    "9 11.75\n",
    "10 12.87\n",
    "11 12.11\n",
    "12 11.37\n",
    "13 11.84\n",
    "14 11.30\n",
    "15 11.29\n",
    "16 11.36\n",
    "17 11.01\n",
    "18 11.37\n",
    "19 11.07\n",
    "20 10.94\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([42.05,\n",
       "  40.47,\n",
       "  40.81,\n",
       "  40.85,\n",
       "  40.41,\n",
       "  40.45,\n",
       "  40.36,\n",
       "  40.7,\n",
       "  40.69,\n",
       "  40.81,\n",
       "  40.84,\n",
       "  40.99,\n",
       "  40.94],\n",
       " [11.07,\n",
       "  11.28,\n",
       "  10.64,\n",
       "  10.75,\n",
       "  10.71,\n",
       "  10.69,\n",
       "  10.68,\n",
       "  10.78,\n",
       "  10.72,\n",
       "  10.73,\n",
       "  11.02,\n",
       "  10.62,\n",
       "  10.94])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "times = defaultdict(list)\n",
    "for line in lines.split('\\n'):\n",
    "    n, s = line.strip().split()\n",
    "    n, s = int(n), float(s)\n",
    "    times[n].append(s)\n",
    "\n",
    "times[1], times[20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10.39"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from statistics import median, mean\n",
    "\n",
    "median_times = []\n",
    "mean_times = []\n",
    "for procs, ts in times.items():\n",
    "    median_times.append(median(ts))\n",
    "    mean_times.append(mean(ts))\n",
    "    \n",
    "min(median_times)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 40.81\n",
      "2 22.79\n",
      "3 15.88\n",
      "4 13.21\n",
      "5 12.29\n",
      "6 10.39\n",
      "7 10.8\n",
      "8 11.4\n",
      "9 11.71\n",
      "10 12.51\n",
      "11 11.24\n",
      "12 11.09\n",
      "13 10.81\n",
      "14 10.64\n",
      "15 10.68\n",
      "16 10.58\n",
      "17 10.76\n",
      "18 10.71\n",
      "19 10.81\n",
      "20 10.73\n"
     ]
    }
   ],
   "source": [
    "for i, t, in enumerate(median_times, 1):\n",
    "    print(i, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "df=pd.DataFrame(\n",
    "    {'procs': range(1,21),\n",
    "     'median': median_times})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAEKCAYAAADUwrbCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAZK0lEQVR4nO3df5BfdX3v8efbBC8QFIgGboTAijfBWi7yY8ulFwVLjIPAANZCZWpvHOnNVKuGqFeWi9epdWyDIJHeuWObKjQjqKCiIKmFGImog8CG8iM0kFCICMQkUhSsFgTe949z1m6yu8l3s+fsdz+7z8fMd77nnO9+39/3d/f7Pa/za8+JzESSJJXhJd1uQJIkdc7gliSpIAa3JEkFMbglSSqIwS1JUkEMbkmSCjK9zeIRsQl4BngBeD4zeyNiJnAN0ANsAs7JzKfa7EOSpMliPNa4fy8zj8rM3nq8D1idmXOB1fW4JEnqQDc2lZ8JrKiHVwBndaEHSZKKFG2eOS0iHgGeAhL428xcHhE/y8z9Bv3MU5m5/zDPXQQsApgxY8axr33ta1vrU5KkiWTt2rU/zcxZwz3W6j5u4ITMfCIiDgBWRcQDnT4xM5cDywF6e3uzv7+/rR4lSZpQIuJHIz3W6qbyzHyivt8KfB04DtgSEbPrxmYDW9vsQZKkyaS14I6IGRHxsoFh4C3AOuAGYGH9YwuB69vqQZKkyabNTeUHAl+PiIHX+WJm/mNE3AlcGxHnAY8CZ7fYgyRJk0prwZ2ZDwOvH2b6k8D8tl5XkqTJzDOnSZJUEINbkqSCGNySJBXE4JYkqSAGtyRJBTG4JUkqiMEtSVJBDG5JkgpicEuSVBCDW5KkghjckiQVxOCWJKkgBrckSQUxuCVJKojBLUlSQQxuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIAa3JEkFMbglSSqIwS1JUkEMbkmSCmJwS5JUEINbkqSCGNySJBXE4JYkqSAGtyRJBZmSwb1s1YZutyBJ0m6ZksF9+eqN3W5BkqTdMiWDW5KkUhnckiQVxOCWJKkg07vdQNuWrdow7D7tnr6V240vnj+XJQvmjVdbkiTtlsjMdl8gYhrQDzyemadHxEzgGqAH2ASck5lP7axGb29v9vf3N9ZTT99KNi09rbF6kiQ1KSLWZmbvcI+Nx6byxcD6QeN9wOrMnAusrsclSVIHWg3uiDgYOA343KDJZwIr6uEVwFlt9iBJ0mTS9hr3Z4CPAC8OmnZgZm4GqO8PGO6JEbEoIvojon/btm0ttylJUhlaC+6IOB3Ymplrd+f5mbk8M3szs3fWrFmN9rZ4/txG60mSNF7aPKr8BOCMiDgV2BN4eURcBWyJiNmZuTkiZgNbW+xhWB49LkkqVWtr3Jl5YWYenJk9wDuA72TmO4EbgIX1jy0Erm+rB0mSJptunIBlKbAgIjYCC+pxSZLUgXE5AUtmrgHW1MNPAvPH43UlSZpsPOWpJEkFMbglSSqIwS1JUkEMbkmSCmJwS5JUEINbkqSCGNySJBXE4JYkqSAGtyRJBTG4JUkqiMEtSVJBDG5JkgpicEuSVBCDW5KkghjckiQVxOCWJKkgBrckSQUxuCVJKojBLUlSQQxuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIAa3JEkFMbglSSqIwS1JUkEMbkmSCmJwS5JUEINbkqSCGNySJBXE4JYkqSAGtyRJBTG4JUkqSGvBHRF7RsQdEXFPRNwfER+vp8+MiFURsbG+37+tHiRJmmzaXON+Fjg5M18PHAWcEhHHA33A6sycC6yuxyVJUgdaC+6s/KIe3aO+JXAmsKKevgI4q60eJEmabFrdxx0R0yLibmArsCozbwcOzMzNAPX9ASM8d1FE9EdE/7Zt29psU5KkYrQa3Jn5QmYeBRwMHBcRR4ziucszszcze2fNmtVek5IkFWRcjirPzJ8Ba4BTgC0RMRugvt86Hj1IkjQZtHlU+ayI2K8e3gt4M/AAcAOwsP6xhcD1bfUgSdJkM73F2rOBFRExjWoB4drMvDEibgOujYjzgEeBs1vsQZKkSWWXwR0RBwPvAN4IvAr4FbAOWAl8KzNfHO55mXkvcPQw058E5o+hZ0mSpqydBndEXAkcBNwIXEy1P3pPYB7V/uqLIqIvM29tu1FJkrTrNe5PZ+a6YaavA66LiJcChzTfliRJGs5OD04bLrQjYv+IOLJ+/LnMfKit5iRJ0vY6Oqo8ItZExMsjYiZwD3BlRFzWbmuSJGlHnf472L6Z+TTw+8CVmXks1b93SZKkcdRpcE+vT5ZyDtWBapIkqQs6De6/AG4CHsrMOyPiMGBje21JkqThdHQClsz8CvCVQeMPA29vqylJkjS8na5xR8RH6wPSRnr85Ig4vfm2JEnScHa1xn0f8M2I+HfgLmAb1QlY5gJHAd8G/rLVDiVJ0m/sNLgz83rg+oiYC5xAdf7xp4GrgEWZ+av2W5QkSQM63ce9EQ9GkySp68bletySJKkZBrckSQUxuCVJKkin5yqfFxGrI2JdPX5kRHy03dYkSdKOOl3j/jvgQuDXAJl5L/COtpqSJEnD6zS4987MO3aY9nzTzUiSpJ3rNLh/GhGvARIgIv4A2NxaV5IkaVgd/R838GfAcuC1EfE48Ajwzta6kiRJw+r0BCwPA2+OiBnASzLzmXbbkiRJw+kouCNiP+B/AD1U1+YGIDM/0FpnBVq2agNLFszrdhuSpEms033c/0AV2vcBawfdNMjlqz0rrCSpXZ3u494zMz/YaieSJGmXOl3j/kJE/M+ImB0RMwdurXYmSZKG6HSN+zngEuAi6n8Jq+8Pa6MpSZI0vE6D+4PAf8nMn7bZTEmWrdow7D7tnr6V240vnj/XA9YkSY3pNLjvB37ZZiOlWbJg3pBA7ulbyaalp3WpI0nSVNBpcL8A3B0RtwDPDkz038EkSRpfnQb3N+qbJEnqok7PnLai7UYkSdKu7TS4I+LazDwnIu7jP44m/43MPLK1zgq0eP7cbrcgSZrkdrXGvbi+P73tRiYDjx6XJLVtpydgycyBS3e+NzN/NPgGvLf99iRJ0mCdnjltwTDT3tpkI5Ikadd2GtwR8Z56//bhEXHvoNsjwL27eO6ciLglItZHxP0RsbiePjMiVkXExvp+/+bejiRJk9uu9nF/EfgW8FdA36Dpz2Tmv+7iuc8DH8rMuyLiZcDaiFgFvAtYnZlLI6KvrnvBbnUvSdIUs9PgzsyfAz8Hzh1t4Xr/+OZ6+JmIWA8cBJwJvKn+sRXAGgxuSZI60uk+7jGJiB7gaOB24MCBg97q+wNGeM6iiOiPiP5t27aNR5uSJE14rQd3ROwDfA04PzOf7vR5mbk8M3szs3fWrFntNShJUkFaDe6I2IMqtK/OzOvqyVsiYnb9+Gxga5s9SJI0mbQW3BERwOeB9Zl52aCHbgAW1sMLgevb6kGSpMmm04uM7I4TgD8G7ouIu+tp/xtYClwbEecBjwJnt9iDJEmTSmvBnZnfB2KEh+e39bqSJE1m43JUuSRJaobBLUlSQQxuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIAb3BLds1YZutyBJmkAM7gnu8tUbu92CJGkCMbglSSqIwS1JUkEMbkmSCtLm1cE0SstWbRh2n3ZP38rtxhfPn8uSBfPGqy1J0gQSmdntHnapt7c3+/v7u91GV/T0rWTT0tO63YYkaRxFxNrM7B3uMTeVS5JUEINbkqSCGNySJBXE4J7gFs+f2+0WJEkTiME9wbVx9LinUZWkchncU5CnUZWkchnckiQVxOCWphh3lUhlM7jVGAOhDO4qkcrmKU8nufE8jerlqzd6KlZJapnBPcktWTBvSJh6GlVJKpebyqUJzN0PknbkGrfUkGWrNjS+q2Csux+84pw0+Rjc2i0GwlATcR//eO4qaWPBRdJQBvcU1MRpVN13rh21seDiwoA0lPu4p6CpPiN0v3E52vrXtVI+A6X0Ce302tb7L6nX4RjcmnIm6v8xL1u1gZ6+ldvdgCHTSpqZT1RtfAba+LuUtODSRq9tvf+Seh2Om8o1oU3UTaVt7OMfr90PXnGuHRPxGIeRlNSrhjK41Zg2AmGizmBK3sffxO/TgxOl7jG41Rhn0FNHGwsuLgxInWktuCPiCuB0YGtmHlFPmwlcA/QAm4BzMvOptnqQDINytLUVo5TPQCl9Qju9tvX+S+q1Y5nZyg04ETgGWDdo2qeAvnq4D7i4k1rH7rNP5pVX5hAnneT0ST79Q6ee33j9Qy+4sfE+88or/6NuQ31mZl5284MT8u8y3PTb5hzReP3tfqcT6HN12c0P5m1zjsgPnXp+HnrBjdvdBk+/7OYHu9pnZuajRx63yz6363UCff4PveDGVj63bXyumv78A/05Qia2tsadmbdGRM8Ok88E3lQPrwDWABe01YPKsuNS7JcffhL+69Cl2O899SvmjHdzHWhjH/+SBfPgk42X1RgtWTAPDnsFx5/9ei59V7VF4DdbB354yXbTu23O/ntx6Q799PSt5Pgd+ldBRkr0Jm5Um8QHr3H/bIfHn9rJcxcB/UD/IYccMnSpRFPCkKX4CVpTuf3aZUPa+luV8rny/U/d989O1rgn7P9xZ+byzOzNzN5Zs2Z1ux1Ju9DGvjz/dU0aaryDe0tEzAao77eO8+tLhkFB2joIq5TPQCl9Qju9tvX+S+p1OOMd3DcAC+vhhcD14/z6UtePyFX3lbJ1oKQFlzZ6bev9l9TrcFoL7oj4EnAbcHhEPBYR5wFLgQURsRFYUI9LIyppjUNTW0kLhCX1qqHaPKr83BEemt/Wa2rycQYjSdubsAenSZKkoQxuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIAa3JEkFMbglSSqIwS1JUkEMbkmSCmJwS5JUEINbkqSCGNySJBXE4JYkqSAGtyRJBTG4JUkqiMEtSVJBDG5JkgpicEuSVBCDW5KkghjckiQVxOCWJKkgBrckSQUxuCVJKojBLUlSQQxuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIAa3JEkFMbglSSqIwS1JUkEMbkmSCmJwS5JUkK4Ed0ScEhEPRsRDEdHXjR4kSSrRuAd3REwD/h/wVuB1wLkR8brx7kOSpBJ1Y437OOChzHw4M58Dvgyc2YU+JEkqzvQuvOZBwI8HjT8G/LcdfygiFgGL6tFfRMSDDfbwSuCnDdZrs24pNduqW0rNtuqWUrOtulO9V9//1H3/h470QDeCO4aZlkMmZC4HlrfSQER/ZvaWULeUmm3VLaVmW3VLqdlW3aneq+9/ar//kXRjU/ljwJxB4wcDT3ShD0mSitON4L4TmBsRr46IlwLvAG7oQh+SJBVn3DeVZ+bzEfE+4CZgGnBFZt4/zm20sgm+pbql1Gyrbik126pbSs226k71Xn3/7Sip1yEic8juZUmSNEF55jRJkgpicEuSVJApFdwRcUVEbI2IdQ3WnBMRt0TE+oi4PyIWN1R3z4i4IyLuqet+vIm6de1pEfFPEXFjQ/U2RcR9EXF3RPQ3UbOuu19EfDUiHqh/v787xnqH1z0O3J6OiPMb6HNJ/TdaFxFfiog9x1qzrru4rnn/7vY53Gc+ImZGxKqI2Fjf799Q3bPrXl+MiFH/W8wINS+p//73RsTXI2K/Bmp+oq53d0TcHBGvaqLXQY99OCIyIl7ZQK9/HhGPD/rMntpEnxHx/vq00/dHxKdGU3MnvV4zqM9NEXF3AzWPiogfDsxbIuK4Bmq+PiJuq+dZ34yIl4+y5rDz/Ca+Vx3LzClzA04EjgHWNVhzNnBMPfwyYAPwugbqBrBPPbwHcDtwfEM9fxD4InBjQ/U2Aa9s4e+1AviTevilwH4N1p4G/AQ4dIx1DgIeAfaqx68F3tVAf0cA64C9qQ4i/TYwdzfqDPnMA58C+urhPuDihur+FnA4sAbobajmW4Dp9fDFo+11hJovHzT8AeBvmui1nj6H6sDbH432OzFCr38OfHgMn6Phav5e/Xn6T/X4AU29/0GPfxr4WAO93gy8tR4+FVjTQM07gZPq4XcDnxhlzWHn+U18rzq9Tak17sy8FfjXhmtuzsy76uFngPVUM/Ox1s3M/EU9ukd9G/ORhBFxMHAa8Lmx1mpTvRR8IvB5gMx8LjN/1uBLzAf+JTN/1ECt6cBeETGdKmibOC/BbwE/zMxfZubzwHeBt422yAif+TOpFoqo789qom5mrs/M3T7D4Qg1b67fP8APqc77MNaaTw8ancFufK92Mi9ZBnyk4Zq7bYSa7wGWZuaz9c9sbaguABERwDnAlxqomcDAGvG+jPK7NULNw4Fb6+FVwNtHWXOkef6Yv1edmlLB3baI6AGOplo7bqLetHpz01ZgVWY2UfczVDOWFxuoNSCBmyNibVSnqm3CYcA24Mp6s/7nImJGQ7WhOn/AqGYsw8nMx4FLgUeBzcDPM/PmsdalWts+MSJeERF7U61tzNnFczp1YGZuhmomBBzQUN22vRv4VhOFIuKTEfFj4I+AjzVU8wzg8cy8p4l6g7yv3rR/RUObX+cBb4yI2yPiuxHxOw3UHOyNwJbM3NhArfOBS+q/1aXAhQ3UXAecUQ+fzRi+VzvM88fte2VwNyQi9gG+Bpy/wxL9bsvMFzLzKKq1jOMi4ogx9ng6sDUz1zbR3yAnZOYxVFd8+7OIOLGBmtOpNnF9NjOPBv6NavPTmEV14p8zgK80UGt/qiXtVwOvAmZExDvHWjcz11NtGl4F/CNwD/D8Tp80iUXERVTv/+om6mXmRZk5p673vrHWqxeuLqKhhYBBPgu8BjiKasHw0w3UnA7sDxwP/C/g2notuSnn0sBCce09wJL6b7WEegvcGL2baj61lmpT93O7U6SNeX6nDO4GRMQeVH/AqzPzuqbr15uI1wCnjLHUCcAZEbGJ6qpsJ0fEVWOsSWY+Ud9vBb5OdQW4sXoMeGzQVoavUgV5E94K3JWZWxqo9Wbgkczclpm/Bq4D/nsDdcnMz2fmMZl5ItXmvibWYAC2RMRsgPp+1JtKx1NELAROB/4o6x2IDfoio9xUOoLXUC283VN/vw4G7oqI/zyWopm5pV6AfxH4O5r7bl1X7467g2rr26gOpBtJvbvo94FrmqgHLKT6TkG1oD3m95+ZD2TmWzLzWKoFjH8ZbY0R5vnj9r0yuMeoXlL9PLA+My9rsO6sgSNoI2IvqoB4YCw1M/PCzDw4M3uoNhV/JzPHtHYYETMi4mUDw1QHE435qP3M/Anw44g4vJ40H/jnsdatNblG8ChwfETsXX8W5lPt8xqziDigvj+EambYVM83UM0Qqe+vb6hu4yLiFOAC4IzM/GVDNecOGj2DMX6vADLzvsw8IDN76u/XY1QHMP1kLHUHgqD2Nhr4bgHfAE6u68+jOvCzqatavRl4IDMfa6jeE8BJ9fDJNLDwOuh79RLgo8DfjPL5I83zx+971dZRbxPxRjXj2wz8muqLdV4DNd9AtY/3XuDu+nZqA3WPBP6prruOUR6h2UH9N9HAUeVU+6LvqW/3Axc12ONRQH/9O/gGsH8DNfcGngT2bbDPj1PN/NcBX6A+WreBut+jWli5B5i/mzWGfOaBVwCrqWaCq4GZDdV9Wz38LLAFuKmBmg9RXQZ44Ls1qiPAR6j5tfpvdS/wTeCgJt7/Do9vYvRHlQ/X6xeA++pebwBmN1DzpcBV9e/gLuDkpt4/8PfAnzb4WX0DsLb+DtwOHNtAzcVUR4JvAJZSn0F0FDWHnec38b3q9OYpTyVJKoibyiVJKojBLUlSQQxuSZIKYnBLklQQg1uSpIIY3JIkFcTglia5iJjW7R4kNcfglgoWET1RXa96RX0hiq/WZ3HbFBEfi4jvA2dHxLn19YfXRcTFg55/SkTcFdV131fX02bUF7S4s77Ay5n19N+O6hrxd9evNbf+2ZX189dFxB/WP3tsfQGLtRFx06BTQX4gIv65fv6Xu/Ark4o3vdsNSBqzw6nOXPWDiLgCeG89/d8z8w0R8SqqS2IeCzxFdSW3s4AfUJ3/+sTMfCQiZtbPu4jqdLjvrk+7e0dEfBv4U+DyzLy6vlDLNKozRj2RmacBRMS+9Xmc/y9wZmZuq8P8k1QXd+gDXp2Zzw6c0lfS6BjcUvl+nJk/qIevAj5QDw9c6OF3gDWZuQ0gIq6mutb5C8CtmfkIQGYOXLf4LVQXo/lwPb4ncAhwG3BRVNd0vy4zN0bEfcCl9Vr8jZn5vfoqdkcAq+qLTk2jOu0kVKeJvDoivkF1GltJo2RwS+Xb8bzFA+P/Vt+PdMnGGOa5A9PfnpkP7jB9fUTcDpwG3BQRf5KZ34mIY6nWvP8qIm6mukLc/Zn5u8PUPo1qoeEM4P9ExG9n5pS9XKm0O9zHLZXvkIgYCMlzge/v8PjtwEkR8cr6QLVzge9SrUGfFBGvBhi0qfwm4P0D12iOiKPr+8OAhzPzr6kueHFkvRn+l5l5FXAp1aVXHwRmDfQUEXvU+8dfAszJzFuAjwD7Afs0/cuQJjvXuKXyrQcWRsTfUl2Z6LPA+wcezMzNEXEhcAvV2vQ/ZOb1ABGxCLiuDtWtwALgE8BngHvr8N5EdT3sPwTeGRG/Bn4C/AXVZvhLIuJFqiswvSczn4uIPwD+OiL2pZrPfIbqakxX1dMCWJbVteYljYJXB5MKFhE9VPuWj+hyK5LGiZvKJUkqiGvckiQVxDVuSZIKYnBLklQQg1uSpIIY3JIkFcTgliSpIP8fcnlZhsHl/ywAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot('procs', 'median', data=df, marker='+', markersize=10, linestyle='None')\n",
    "plt.axhline(min(median_times), linestyle=(0, (1, 3)), color='red')\n",
    "plt.ylim([0, 50])\n",
    "plt.ylabel('time (s)')\n",
    "plt.xlabel('processes')\n",
    "plt.xticks([i for i in range(1, 21)])\n",
    "print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Thanks to these generous twitizens for helping me customize this graph:\n",
    "\n",
    "* [@hcpyz](https://twitter.com/hcpyz/status/1355310776916062211)\n",
    "* [@guilhrme_alves](https://twitter.com/guilhrme_alves/status/1355314798796414982)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
